﻿#pragma once
#include "Panel.h"

_NAMESPACE_BEGIN

#define UPDATE_PS	1.0f/90.0f

class PhysXObj;

/// 物理管理器类，高层次地管理整个游戏的物理场景
/// 本类的单体对象将挂接到游戏内核，以供每帧执行

class PhysicsManager : public Panel
{
public:
	
	/// 单体类声明
	SINGLETON_HELPER(PhysicsManager)

	/// 构造函数
	PhysicsManager();

	/// 析构函数
	virtual ~PhysicsManager();

public:
	
	/// 初始化PhysX SDK和物理场景
	void InitialNx(NxSceneDesc& sceneDesc);
	
	/// 更新物理场景，完成物理仿真
	void Update();				

	/// 更新场景中的物体
	void ObjectsUpdate();		

	/// 设置物理模拟的速度
	void SetSpeed(float r){this->speedRate=r;}	

	/// 添加一个物理物体
	void AddObj(PhysXObj* obj);

	/// 删除一个给定的物理物体
	void RemoveObj(PhysXObj* obj);

	/// 得到世界物体的场景
	NxScene* GetWorldScene();

	/// 获取PhysX SDK接口
	NxPhysicsSDK* GetPhysicsSDK(){return gPhysicsSDK;}	

	/// 连接到远程物理调试器
	void ConnectToRemoteDebuger();

	/// 从文件载入物理模型
	void LoadPhysMesh(CONST_REF(std::string)fileName, CONST_REF(std::string)name, CONST_REF(NxVec3)pos);

	/// 以名称获取actor
	NxActor* GetMeshActor(CONST_REF(std::string)name);

protected:

	/// 进行一帧的模拟
	void StartPhysics(float worldtime);

	/// 得到当前帧的模拟结果
	void GetPhysicsResults();

protected:
	std::list<PhysXObj*> physObj;	///<物理物件列表
	NxScene*		pWorldScene ;	///<世界场景
	NxPhysicsSDK*   gPhysicsSDK;///<物理引擎
	Clock			worldClock;///<用来计算模拟时间步长的计时器
	float			simulateTime;///<世界空间的模拟时间 
	float			speedRate;///<模拟速率
	hash_map<std::string,NxActor*>	physMeshTable;	///<物理模型表
};

_NAMESPACE_END